home *** CD-ROM | disk | FTP | other *** search
- shel_write erfüllt ZWEI Zwecke:
-
- 1. Man teilt damit einem daraufhin irgendwie gestarteten Programm
- seinen Namen/Pfad sowie die Argumentzeile mit. Das gestartete
- GEM-Programm erfährt diese Daten durch Aufruf von shel_read().
-
- 2. Ein Programm kann ein "Chaining" durchführen. D.h, es kann
- erreichen, daß es selbst terminiert und daraufhin ein anderes
- Programm starten läßt.
- Demgegenüber kann ein Programm über "Pexec()" auch jederzeit
- ein anderes Programm als "Unterroutine" starten.
- Während beim Chaining dem nachgestarteten Programm wieder aller
- Speicher zur Verfügung steht, ist beim "Unterprogrammaufruf"
- der Speicher knapper, weil ja das startende Prg im Speicher verbleibt.
-
- Signum startet beispielsweise den Druckertreiber über diesen
- Chaining-Mechanismus: Dazu ruft Signum "shel_write()" mit dem
- Namen des Druckprogramms als Prgnamen und des bearbeiteten Textes
- als Arg-Zeile auf und terminiert daraufhin. Wurde Signum vom
- Desktop aus gestartet, erkennt dieser nun, daß Signum shel_write()
- gerufen hatte und startet nun automatisch das gewünschte Programm.
- Will das Druckprogramm wieder die Kontrolle zurück an Signum geben,
- muß es dies wiederum auf die selbe Weise über shel_write tun.
-
- Wird Signum aber beispielsweise von einer anderen Shell aus
- gestartet, muß diese die Funktion des Desktops übernehmen, d.h,
- erkennen, daß das vorige Programm "shel_write" rief und entsprechend
- reagieren (Pexec() aufrufen). Das Problem dabei ist aber, daß
- dazu leider eine Information fehlt: Wird shel_write gerufen, werden
- nicht nur Progname und Argzeile gemerkt, sondern auch ein Flag
- gesetzt, daß den Aufruf anzeigt (seit TOS 1.4 kann dieses Flag
- übrigens auch wieder gelöscht werden). Der Desktop prüft dieses
- Flag, um zu erkennen, daß ein shel_write-Aufruf erfolgt war.
- Dann setzt es das Flag zrück und startet das gewünschte Programm.
- Eine andere Shell kann aber dieses Flag nicht abfragen. Stattdessen
- muß es ein anderes Verfahren anwenden: Es geht davon aus, daß
- ein Programm niemals sich selbst per Chaining nachstarten wird
- (ist ja wohl sinnlos). Also prüft es nach der Rückkehr eines
- gestarteten Programms mit shel_read(), ob noch der selbe PrgName
- wie vor dem Start bestimmt ist. In diesem Fall hat das Prg
- offenbar keinen shel_write-Aufruf durchgeführt.
-
- Nur wenige Shells tun auch dieses "Chaining" berücksichtigen, so
- z.B. GEMINI. Neodesk versucht das auch, aber mit einem ganz
- anderen Verfahren (es hängt sich in den AES-TRAP-Vektor und
- setzt sich selbst ein Flag, wenn shel_write gerufen wird) und
- dies geht dann auch bei einigen Dingen in die Hose, so z.B.
- bei der Megamax-Shell, die die seit TOS 1.4 verfügbare Möglichkeit
- des Rücksetzen des internen Flag benutzt, Neodesk das aber noch
- nicht berücksichtigt.
-
- Ach ja, daraus folgt auch: Wenn ein Programm/Shell ein anderes mit
- Pexec als Unterprg. startet, und es vorher ordnungsgemäß Prgname/Argzeile
- per shel_write mitteilt, muß es hinterher nicht nur das Flag
- zurücksetzen, damit der Desktop das Programm bei Ende des Shell
- nicht nochmal startet, sondern man muß auch den eigenen Namen
- wieder einsetzen, damit Programme wie GEMINI nicht das Prg nochmal
- starten.
-
- Und dann gibt's da ja noch die anderen Problemchen, z.B. das Schließen
- der eventuell offenen ACC-Fenster. Ganz schön aufwendig, das Ganze, nicht?
- Wer mehr wissen will, soll sich das MM2 zulegen - das kann er im
- mitgelieferten Source der Shell alles abgucken :-)
-
- Claus, ist damit Deine Frage beantwortet?
-
- Wird wohl mal wieder Zeit für einen Artikel, wie?
-
- TT
-